/**
 * @p.md
 * 
 * ActorProcess 模块，实现 Actor 进程
 */
import { Process } from './process';
import { PID } from './pid';
import { Mailbox } from './mailbox';
import { SystemMessages, Terminated } from './systemMessages';

/**
 * Actor 进程实现，管理 Actor 实例的邮箱和生命周期
 */
export class ActorProcess implements Process {
  /**
   * 标记进程是否已终止
   */
  private _dead: boolean = false;

  /**
   * 构造函数
   * @param mailbox Actor 的邮箱
   */
  constructor(private readonly mailbox: Mailbox) {}

  /**
   * 发送用户消息到 Actor
   * @param pid 目标 PID
   * @param message 用户消息
   */
  sendUserMessage(pid: PID, message: any): void {
    if (this._dead) {
      // 如果进程已终止，不处理消息
      // 在实际实现中，这里应该将消息发送到 DeadLetter 处理
      return;
    }
    
    this.mailbox.postMessage(message);
  }

  /**
   * 发送系统消息到 Actor
   * @param pid 目标 PID
   * @param message 系统消息
   */
  sendSystemMessage(pid: PID, message: any): void {
    if (this._dead && !(message instanceof Terminated)) {
      // 如果进程已终止，且不是终止消息，则不处理
      // 终止消息即使进程已死亡也需要处理
      return;
    }
    
    this.mailbox.postSystemMessage(message);
  }

  /**
   * 停止 Actor 进程
   * @param pid 要停止的 PID
   */
  stop(pid: PID): void {
    if (this._dead) {
      return;
    }
    
    this._dead = true;
    
    // 发送停止消息
    this.sendSystemMessage(pid, SystemMessages.stop());
  }

  /**
   * 检查进程是否已终止
   * @returns 进程是否已终止
   */
  isDead(): boolean {
    return this._dead;
  }

  /**
   * 获取邮箱
   * @returns Actor 的邮箱
   */
  getMailbox(): Mailbox {
    return this.mailbox;
  }
}

/**
 * Actor 进程工厂，提供创建 Actor 进程的方法
 */
export const ActorProcesses = {
  /**
   * 创建新的 Actor 进程
   * @param mailbox Actor 的邮箱
   * @returns Actor 进程实例
   */
  create(mailbox: Mailbox): Process {
    return new ActorProcess(mailbox);
  }
}; 